package com.killer_jin.core.common.enums;

import com.killer_jin.core.module.system.entity.User;
import org.junit.Test;

import java.util.Arrays;

public class TestEnum {
    @Test
    public void testEnum() {
        // values()方法和valueOf(String name)方法是编译器生成的static方法，因此从前面的分析中，在Enum类中并没出现values()
        // 方法，但valueOf()方法还是有出现的，只不过编译器生成的valueOf()方法需传递一个name参数，而Enum自带的静态方法
        // valueOf()则需要传递两个方法，从前面反编译后的代码可以看出，编译器生成的valueOf方法最终还是调用了Enum类的valueOf方法.

        AuthStatusEnum[] days2 = AuthStatusEnum.values();
        System.out.println("day2:" + Arrays.toString(days2));
        AuthStatusEnum day = AuthStatusEnum.valueOf("MONDAY");
        System.out.println("day:"+day);

        // values()方法的作用就是获取枚举类中的所有变量，并作为数组返回，而valueOf(String name)方法与Enum类中的valueOf方法的
        // 作用类似根据名称获取枚举变量，只不过编译器生成的valueOf方法更简洁些只需传递一个参数。这里我们还必须注意到，由于
        // values()方法是由编译器插入到枚举类中的static方法，所以如果我们将枚举实例向上转型为Enum，那么values()方法将无法被
        // 调用，因为Enum类中并没有values()方法，valueOf()方法也是同样的道理，注意是一个参数的
        //正常使用
        AuthStatusEnum[] ds=AuthStatusEnum.values();
        //向上转型Enum
        Enum e = AuthStatusEnum.AUTHED;
        //无法调用,没有此方法
        //e.values();
    }

    // 测试 使用枚举实现单例模式
    @Test
    public void testSingleEnum() {
        User sinleUserInstance1 = SingletonEnum.SINGLETON.getSinleUserInstance();
        User sinleUserInstance2 = SingletonEnum.SINGLETON.getSinleUserInstance();
        User sinleUserInstance3 = SingletonEnum.SINGLETON.getSinleUserInstance();
        System.out.println(sinleUserInstance1);
        System.out.println(sinleUserInstance2);
        System.out.println(sinleUserInstance3);
    }
}
